#!/usr/bin/env python

import os
import sys

import django

sys.path.insert(0, '../')  # 下面配置文件路径会找到

# 添加
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meid_duo.settings.dev")

django.setup()
from django.conf import settings
from django.shortcuts import render

from contents.utils import get_categories
from goods.models import SKU
from goods.utils import get_breadcrumb


def generate_static_sku_detail_html(sku_id):

    sku = SKU.objects.get(id=sku_id)

    category = sku.category  # 获取当前sku所对应的所有三级分类
    spu = sku.spu  # 获取当前sku所对应的spu信息

    # 1.准备当前商品的规格选项列表 [8, 11]
    # 获取出当前正显示的sku商品的规格选项id列表
    current_sku_spec_qs = sku.specs.order_by("spec_id")  # 获取当前sku的所有规格选项
    current_sku_spec_qs_ids = []
    for current_sku in current_sku_spec_qs:  # 获取每一个选项
        # 通过选项获得每一个选项的option_id，并将其添加到字典中去
        current_sku_spec_qs_ids.append(current_sku.option_id)

    # 2.构造规格选择仓库
    #   {(8, 11): 3, (8, 12): 4, (9, 11): 5, (9, 12): 6, (10, 11): 7, (10, 12): 8}
    temp_sku_qs = spu.sku_set.all()  # 准备当前spu下的所有sku
    spec_sku_map = {}  # 构造仓库
    for temp_sku in temp_sku_qs:
        # 获取每一个sku下的所有规格选项
        temp_spec_qs = temp_sku.specs.order_by("spec_id")
        temp_sku_option_ids = []
        for temp_spec in temp_spec_qs:  # 获取每一个选项
            # 通过选项获得每一个选项的option_id，并将其添加到字典中去
            temp_sku_option_ids.append(temp_spec.option_id)
        # 将得到的字典转化为元组作为仓库字典的键，且以当前sku的id作为值，添加到字典中
        spec_sku_map[tuple(temp_sku_option_ids)] = temp_sku.id

    # 3.组合 并找到sku_id 绑定
    # 获取sku的所有规格型号，因为sku未关联spu规格信息表，而spu与规格表有外建关联，所以通过spu（主表）去查规格信息表（从表）
    spu_spec_qs = spu.specs.order_by(("id"))  # 查寻当前所有的spu规格
    for index, spec in enumerate(spu_spec_qs):
        # 通过规格信息表去查询每个规格下的所有规格选项表（例如：颜色规格下黄色，红色等规格选项）
        spec_options_qs = spec.options.all()
        temp_option_ids = current_sku_spec_qs_ids[:]  # 复制一个新的当前显示商品的规格选项列表
        for option in spec_options_qs:  # 遍历当前规格下的所有选项
            temp_option_ids[index] = option.id  # 动态更改列表中的值，（该列表为仓库字典的键）
            # 通过上面动态的键来获取相对应的值，即id，作为返回给前端动态的id，实现不同选项规格时页面刷新
            option.sku_id = spec_sku_map.get(tuple(temp_option_ids))
        spec.spec_options = spec_options_qs  # 把规格下的所有选项绑定到规格对象的spec_options属性上

    context = {
        "categories": get_categories(),  # 商品分类
        "breadcrumb": get_breadcrumb(category),  # 面包屑导航
        "spu": spu,  # 当前sku所对应的spu模型类
        "sku": sku,  # 当前显示的sku模型类
        "category": category,  # 当前的显示sku所属的三级类别
        'spec_qs': spu_spec_qs,  # 当前sku商品的所有规格及规格选项
    }

    response = render(None, 'detail.html', context)
    html_text = response.content.decode()
    file_path = os.path.join(settings.STATICFILES_DIRS[0], 'detail/' + str(sku_id) + '.html')
    with open(file_path, 'w') as f:
        f.write(html_text)

if __name__ == '__main__':
    skus = SKU.objects.all()
    for sku in skus:
        print(sku.id)
        generate_static_sku_detail_html(sku.id)